package com.wusiwei.service;

import com.wusiwei.common.PageRequest;
import com.wusiwei.common.PageResult;
import com.wusiwei.common.Result;
import com.wusiwei.entity.Invoice;
import com.wusiwei.entity.Order;

import java.util.List;
import java.util.Map;

/**
 * 发票服务接口
 */
public interface InvoiceService {
    /**
     * 更新发票
     *
     * @param invoice 发票对象
     * @return 操作结果
     */
    Result<Invoice> update(Invoice invoice);

    /**
     * 删除发票
     *
     * @param id 发票ID
     * @return 操作结果
     */
    Result<Void> delete(Long id);

    /**
     * 根据ID查询发票
     *
     * @param id 发票ID
     * @return 发票对象
     */
    Result<Invoice> findById(Long id);

//    /**
//     * 根据条件查询发票
//     *
//     * @param invoice 查询条件
//     * @return 发票列表
//     */
//    Result<List<Invoice>> findByCondition(Invoice invoice);

    /**
     * 根据条件查询发票
     *
     * @param condition 查询条件Map
     * @return 发票列表
     */
    List<Invoice> findByCondition(Map<String, Object> condition);

//    /**
//     * 根据日期范围查询发票
//     *
//     * @param startDate 开始日期
//     * @param endDate   结束日期
//     * @return 发票列表
//     */
//    Result<List<Invoice>> findByDateRange(LocalDate startDate, LocalDate endDate);

    /**
     * 根据日期范围查询发票（字符串日期格式）
     *
     * @param startDate 开始日期（字符串格式：yyyy-MM-dd）
     * @param endDate   结束日期（字符串格式：yyyy-MM-dd）
     * @return 发票列表
     */
    List<Invoice> findByDateRange(String startDate, String endDate);

//    /**
//     * 上传发票文件
//     *
//     * @param file      文件
//     * @param invoiceId 发票ID
//     * @return 文件路径
//     */
//    Result<String> uploadFile(MultipartFile file, Long invoiceId);

    /**
     * 创建发票
     *
     * @param invoice 发票对象
     * @return 创建的发票
     */
    Invoice create(Invoice invoice);

    /**
     * 根据ID获取发票
     *
     * @param id 发票ID
     * @return 发票对象
     */
    Invoice getById(Long id);

    /**
     * 获取所有发票
     *
     * @return 发票列表
     */
    List<Invoice> list();

    /**
     * 搜索发票
     *
     * @param keyword 关键字
     * @return 发票列表
     */
    List<Invoice> search(String keyword);

    /**
     * 根据类型过滤发票
     *
     * @param type 类型
     * @return 过滤后的发票列表
     */
    List<Invoice> filter(String type);

    /**
     * 验证发票
     *
     * @param id 发票ID
     * @return 验证结果
     */
    String verify(Long id);

    /**
     * 获取发票统计信息
     *
     * @return 统计信息
     */
    Map<String, Object> getStatistics();

    /**
     * 分页查询发票
     *
     * @param pageRequest 分页参数
     * @return 分页结果
     */
    PageResult<Invoice> page(PageRequest pageRequest);

    /**
     * 更新发票文件路径
     *
     * @param id       发票ID
     * @param filePath 文件路径
     * @return 更新结果
     */
    Result<Void> updateFilePath(Long id, String filePath);

    /**
     * 统计发票总数
     *
     * @return 发票总数
     */
    int countTotal();

//    /**
//     * 统计发票总金额
//     *
//     * @return 发票总金额
//     */
//    java.math.BigDecimal sumTotalAmount();

//    /**
//     * 统计发票总税额
//     *
//     * @return 发票总税额
//     */
//    java.math.BigDecimal sumTotalTax();

//    /**
//     * 统计价税合计总额
//     *
//     * @return 价税合计总额
//     */
//    java.math.BigDecimal sumTotalAmountWithTax();
//
//    /**
//     * 统计当月发票数量
//     *
//     * @return 当月发票数量
//     */
//    int countByCurrentMonth();
//
//    /**
//     * 统计当月发票金额
//     *
//     * @return 当月发票金额
//     */
//    java.math.BigDecimal sumAmountByCurrentMonth();
//
//    /**
//     * 按类别分组统计发票数量
//     *
//     * @return 类别统计结果
//     */
//    List<Map<String, Object>> countGroupByCategory();
//
//    /**
//     * 按供应商分组统计发票数量
//     *
//     * @return 供应商统计结果
//     */
//    List<Map<String, Object>> countGroupBySupplier();
//
//    /**
//     * 按日期统计发票
//     *
//     * @param startDate 开始日期
//     * @param endDate   结束日期
//     * @return 日期统计结果
//     */
//    List<Map<String, Object>> getInvoiceDateStats(String startDate, String endDate);
//
//    /**
//     * 统计各个月份的发票总额
//     *
//     * @param startDate 开始日期
//     * @param endDate   结束日期
//     * @return 统计结果
//     */
//    List<Map<String, Object>> sumAmountGroupByMonth(LocalDate startDate, LocalDate endDate);

    /**
     * 获取未匹配的发票列表
     *
     * @param limit 限制返回数量，默认为100
     * @return 未匹配的发票列表
     */
    List<Invoice> findUnmatchedInvoices(Integer limit);

    /**
     * 导出发票数据为Excel
     *
     * @param startDate 开始日期
     * @param endDate   结束日期
     * @return Excel文件的字节数组
     */
    byte[] exportInvoices(String startDate, String endDate);

    /**
     * 部分更新发票信息
     *
     * @param id   发票ID
     * @param data 部分发票数据
     * @return 更新后的发票
     */
    Invoice partialUpdate(Long id, Map<String, Object> data);

    /**
     * 根据发票号码查询发票
     *
     * @param invoiceNumber 发票号码
     * @return 发票信息
     */
    Invoice findByInvoiceNumber(String invoiceNumber);

    /**
     * 批量删除发票
     *
     * @param ids 发票ID列表
     * @return 是否删除成功
     */
    boolean batchDelete(List<Long> ids);

    /**
     * 获取发票关联的订单
     *
     * @param id 发票ID
     * @return 关联的订单列表
     */
    List<Order> getRelatedOrders(Long id);
} 